home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Medal Software 2
/
Gold Medal Software Volume 2 (Gold Medal) (1994).iso
/
windows
/
win31
/
macsyma.arj
/
MACSDEMO.EXE
/
FACEXP.OUT
< prev
next >
Wrap
Text File
|
1993-09-15
|
23KB
|
254 lines
(c1) /* DEMONSTRATION OF SPECIAL FACTORING-EXPANSION PACKAGE `FACEXP'
*/
if get('facexp,'version)=false then load('facexp);
C:\MACSD2B\share\FACEXP.fas being loaded.
|$label(0,15,Times New Roman,$(d1$))C:\MACSD2B\share\FACEXP.fas
(c2) /* Here is an expression to work with. */
exp1: d*e*f^2 + c*e*f^2 - d*e + c*e + b*c*d + a*c*d;
|$label(0,15,Times New Roman,$(d2$))d$in( )e$in( )$sup(f,2)$hinge()$in( + )c$in( )e$in( )$sup(f,2)$hinge()$in( - )d$in( )e$hinge()$in( + )c$in( )e$hinge()$in( + )b$in( )c$in( )d$hinge()$in( + )a$in( )c$in( )d
(c3) /* The function FACSUM can be used to cast an expression into a form
in which it is fully expanded with respect to a specified set of
variables, but factored with respect to all other variables.
*/
facsum(exp1,e,f);
C:\MACSD2B\share\genut.fas being loaded.
C:\MACSD2B\share\index.fas being loaded.
|$label(0,15,Times New Roman,$(d3$))$paren(d$in( + )c,$(,$))$in( )e$in( )$sup(f,2)$hinge()$in( - )$paren(d$in( - )c,$(,$))$in( )e$hinge()$in( + )$paren(b$in( + )a,$(,$))$in( )c$in( )d
(c4) /* Another example: */
exp2: c*d*(x*y*z+w*y*z+u*v^2*z-u*z+u*v^2*y+u*y)
+ d*e*f^2 + c*e*f^2 - d*e + c*e + b*c*d;
|$label(0,15,Times New Roman,$(d4$))c$in( )d$in( )$paren(x$in( )y$in( )z$in( + )w$in( )y$in( )z$in( + )u$in( )$sup(v,2)$in( )z$in( - )u$in( )z$in( + )u$in( )$sup(v,2)$in( )y$in( + )u$in( )y,$(,$))$hinge()$in( + )d$in( )e$in( )$sup(f,2)$hinge()$in( + )c$in( )e$in( )$sup(f,2)$hinge()$in( - )d$in( )e$hinge()$in( + )c$in( )e$hinge()$in( + )b$in( )c$in( )d
(c5) /* Another mode in which FACSUM is useful results in a form in which
a second set of variables plays the same role as above, but one level
deeper in the expression. These variables are given to FACSUM in a
list. */
answer: facsum(exp2,c,d,[u,v]);
|$label(0,15,Times New Roman,$(d5$))c$in( )d$in( )$paren(u$in( )$sup(v,2)$in( )$paren(z$in( + )y,$(,$))$in( - )u$in( )$paren(z$in( - )y,$(,$))$in( + )x$in( )y$in( )z$in( + )w$in( )y$in( )z$in( + )b,$(,$))$hinge()$in( + )c$in( )e$in( )$paren($sup(f,2)$in( + )1,$(,$))$hinge()$in( + )d$in( )e$in( )$paren(f$in( - )1,$(,$))$in( )$paren(f$in( + )1,$(,$))
(c6) /* The list can occur in any position in the argument list. */
facsum(exp2,[u,v],c,d);
|$label(0,15,Times New Roman,$(d6$))c$in( )d$in( )$paren(u$in( )$sup(v,2)$in( )$paren(z$in( + )y,$(,$))$in( - )u$in( )$paren(z$in( - )y,$(,$))$in( + )x$in( )y$in( )z$in( + )w$in( )y$in( )z$in( + )b,$(,$))$hinge()$in( + )c$in( )e$in( )$paren($sup(f,2)$in( + )1,$(,$))$hinge()$in( + )d$in( )e$in( )$paren(f$in( - )1,$(,$))$in( )$paren(f$in( + )1,$(,$))
(c7) /* Or it can be split up. */
facsum(exp2,c,[u],d,[v]);
|$label(0,15,Times New Roman,$(d7$))c$in( )d$in( )$paren(u$in( )$sup(v,2)$in( )$paren(z$in( + )y,$(,$))$in( - )u$in( )$paren(z$in( - )y,$(,$))$in( + )x$in( )y$in( )z$in( + )w$in( )y$in( )z$in( + )b,$(,$))$hinge()$in( + )c$in( )e$in( )$paren($sup(f,2)$in( + )1,$(,$))$hinge()$in( + )d$in( )e$in( )$paren(f$in( - )1,$(,$))$in( )$paren(f$in( + )1,$(,$))
(c8) /* List arguments can be nested arbitrarily deeply,
depending upon the requirements of the situation. */
exp3: c*d*q*x*y*z+2*c*d*m*p*x*y*z+c*d*m*n*x*y*z + c*d*q*w*y*z
+ 2*c*d*m*p*w*y*z + c*d*m*n*w*y*z + c*d*q*u*v^2*z + 2*c*d*m*p*u*v^2*z
+ c*d*m*n*u*v^2*z - c*d*q*u*z-2*c*d*m*p*u*z - c*d*m*n*u*z+c*d*u*v^2*y
+ c*d*u*y + d*e*f^2 + c*e*f^2 - d*e + c*e + b*c*d;
|$label(0,15,Times New Roman,$(d8$))c$in( )d$in( )q$in( )x$in( )y$in( )z$hinge()$in( + )2$in( )c$in( )d$in( )m$in( )p$in( )x$in( )y$in( )z$hinge()$in( + )c$in( )d$in( )m$in( )n$in( )x$in( )y$in( )z$hinge()$in( + )c$in( )d$in( )q$in( )w$in( )y$in( )z$hinge()$in( + )2$in( )c$in( )d$in( )m$in( )p$in( )w$in( )y$in( )z$hinge()$in( + )c$in( )d$in( )m$in( )n$in( )w$in( )y$in( )z$hinge()$in( + )c$in( )d$in( )q$in( )u$in( )$sup(v,2)$in( )z$hinge()$in( + )2$in( )c$in( )d$in( )m$in( )p$in( )u$in( )$sup(v,2)$in( )z$hinge()$in( + )c$in( )d$in( )m$in( )n$in( )u$in( )$sup(v,2)$in( )z$hinge()$in( - )c$in( )d$in( )q$in( )u$in( )z$hinge()$in( - )2$in( )c$in( )d$in( )m$in( )p$in( )u$in( )z$hinge()$in( - )c$in( )d$in( )m$in( )n$in( )u$in( )z$hinge()$in( + )c$in( )d$in( )u$in( )$sup(v,2)$in( )y$hinge()$in( + )c$in( )d$in( )u$in( )y$hinge()$in( + )d$in( )e$in( )$sup(f,2)$hinge()$in( + )c$in( )e$in( )$sup(f,2)$hinge()$in( - )d$in( )e$hinge()$in( + )c$in( )e$hinge()$in( + )b$in( )c$in( )d
(c9) facsum(exp3,c,d,[u,v,[z,[m]]]);
|$label(0,15,Times New Roman,$(d9$))c$in( )d$in( )$paren(u$in( )$sup(v,2)$in( )$paren($paren(q$in( + )m$in( )$paren(2$in( )p$in( + )n,$(,$)),$(,$))$in( )z$in( + )y,$(,$))$in( + )u$in( )$paren($paren($in( - )q$in( - )m$in( )$paren(2$in( )p$in( + )n,$(,$)),$(,$))$in( )z$in( + )y,$(,$))$in( + )$paren(q$in( )$paren(x$in( + )w,$(,$))$in( + )m$in( )$paren(2$in( )p$in( + )n,$(,$))$in( )$paren(x$in( + )w,$(,$)),$(,$))$in( )y$in( )z$in( + )b,$(,$))$hinge()$in( + )c$in( )e$in( )$paren($sup(f,2)$in( + )1,$(,$))$hinge()$in( + )d$in( )e$in( )$paren(f$in( - )1,$(,$))$in( )$paren(f$in( + )1,$(,$))
(c10) /* The arguments of FACSUM need not be atomic. */
exp4: subst(log(m+n),c,exp2);
|$label(0,15,Times New Roman,$(d10$))d$in( )log$paren(n$in( + )m)$in( )$paren(x$in( )y$in( )z$in( + )w$in( )y$in( )z$in( + )u$in( )$sup(v,2)$in( )z$in( - )u$in( )z$in( + )u$in( )$sup(v,2)$in( )y$in( + )u$in( )y,$(,$))$hinge()$in( + )e$in( )$sup(f,2)$in( )log$paren(n$in( + )m)$hinge()$in( + )e$in( )log$paren(n$in( + )m)$hinge()$in( + )b$in( )d$in( )log$paren(n$in( + )m)$hinge()$in( + )d$in( )e$in( )$sup(f,2)$hinge()$in( - )d$in( )e
(c11) facsum(exp4,log(m+n),[e,f]);
|$label(0,15,Times New Roman,$(d11$))log$paren(n$in( + )m)$in( )$paren(d$in( )$paren(x$in( )y$in( )z$in( + )w$in( )y$in( )z$in( + )u$in( )$sup(v,2)$in( )z$in( - )u$in( )z$in( + )u$in( )$sup(v,2)$in( )y$in( + )u$in( )y$in( + )b,$(,$))$in( + )e$in( )$sup(f,2)$in( + )e,$(,$))$hinge()$in( + )d$in( )e$in( )$sup(f,2)$hinge()$in( - )d$in( )e
(c12) /* FACSUM also recognizes in its argument the special form OPERATOR.
This form can be used to indicate to FACSUM that all structures within its
argument that have certain indicated leading operators are to be
specially treated. For example, consider the expression EXP5:
*/
exp5: x + (a.b)*(c+d) + (b.a)*(d+c) + log(a*b)*2*(c+d) + log(a/b)*2*(d+c);
|$label(0,15,Times New Roman,$(d12$))x$hinge()$in( + )2$in( )log$paren(a$in( )b)$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )$paren(b$in( . )a,$(,$))$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )2$in( )log$paren($q(a,b))$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )$paren(a$in( . )b,$(,$))$in( )$paren(d$in( + )c,$(,$))
(c13) /* First FACTOR EXP5, to obtain an expression to work on. */
exp5_factored:factor(exp5);
|$label(0,15,Times New Roman,$(d13$))x$hinge()$in( + )2$in( )log$paren(a$in( )b)$in( )d$hinge()$in( + )$paren(b$in( . )a,$(,$))$in( )d$hinge()$in( + )2$in( )log$paren($q(a,b))$in( )d$hinge()$in( + )$paren(a$in( . )b,$(,$))$in( )d$hinge()$in( + )2$in( )log$paren(a$in( )b)$in( )c$hinge()$in( + )$paren(b$in( . )a,$(,$))$in( )c$hinge()$in( + )2$in( )log$paren($q(a,b))$in( )c$hinge()$in( + )$paren(a$in( . )b,$(,$))$in( )c
(c14) /* To demonstrate the use of OPERATOR, we recover the original
form of EXP5. */
facsum(exp5_factored,operator(log,"."));
C:\MACSD2B\share\listop.fas being loaded.
|$label(0,15,Times New Roman,$(d14$))x$hinge()$in( + )2$in( )log$paren(a$in( )b)$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )$paren(b$in( . )a,$(,$))$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )2$in( )log$paren($q(a,b))$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )$paren(a$in( . )b,$(,$))$in( )$paren(d$in( + )c,$(,$))
(c15) is(%=exp5);
|$label(0,15,Times New Roman,$(d15$))true
(c16) /* This form also works: */
facsum(exp5_factored,operator(log),operator("."));
|$label(0,15,Times New Roman,$(d16$))x$hinge()$in( + )2$in( )log$paren(a$in( )b)$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )$paren(b$in( . )a,$(,$))$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )2$in( )log$paren($q(a,b))$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )$paren(a$in( . )b,$(,$))$in( )$paren(d$in( + )c,$(,$))
(c17) /* Another function that is related to FACSUM is FACTORFACSUM.
FACTORFACSUM is similar to FACSUM, except that it first factors the
expression, then calls FACSUM on each of the factors. It can take all
the arguments that FACSUM can, including the nested lists and the form
OPERATOR.
*/
exp6: exp5*2*(e+(h+f)*(e.f));
|$label(0,15,Times New Roman,$(d17$))2$hinge()$in( )$open($()$paren(e$in( . )f,$(,$))$in( )$paren(h$in( + )f,$(,$))$hinge()$in( + )e$close($))$hinge()$in( )$open($()x$hinge()$in( + )2$in( )log$paren(a$in( )b)$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )$paren(b$in( . )a,$(,$))$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )2$in( )log$paren($q(a,b))$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )$paren(a$in( . )b,$(,$))$in( )$paren(d$in( + )c,$(,$))$close($))
(c18) /* EXPAND it. */
exp6_expanded:expand(exp6);
|$label(0,15,Times New Roman,$(d18$))2$in( )$paren(e$in( . )f,$(,$))$in( )h$in( )x$hinge()$in( + )2$in( )$paren(e$in( . )f,$(,$))$in( )f$in( )x$hinge()$in( + )2$in( )e$in( )x$hinge()$in( + )4$in( )log$paren(a$in( )b)$in( )d$in( )$paren(e$in( . )f,$(,$))$in( )h$hinge()$in( + )2$in( )$paren(b$in( . )a,$(,$))$in( )d$in( )$paren(e$in( . )f,$(,$))$in( )h$hinge()$in( + )4$in( )log$paren($q(a,b))$in( )d$in( )$paren(e$in( . )f,$(,$))$in( )h$hinge()$in( + )2$in( )$paren(a$in( . )b,$(,$))$in( )d$in( )$paren(e$in( . )f,$(,$))$in( )h$hinge()$in( + )4$in( )log$paren(a$in( )b)$in( )c$in( )$paren(e$in( . )f,$(,$))$in( )h$hinge()$in( + )2$in( )$paren(b$in( . )a,$(,$))$in( )c$in( )$paren(e$in( . )f,$(,$))$in( )h$hinge()$in( + )4$in( )log$paren($q(a,b))$in( )c$in( )$paren(e$in( . )f,$(,$))$in( )h$hinge()$in( + )2$in( )$paren(a$in( . )b,$(,$))$in( )c$in( )$paren(e$in( . )f,$(,$))$in( )h$hinge()$in( + )4$in( )log$paren(a$in( )b)$in( )d$in( )$paren(e$in( . )f,$(,$))$in( )f$hinge()$in( + )2$in( )$paren(b$in( . )a,$(,$))$in( )d$in( )$paren(e$in( . )f,$(,$))$in( )f$hinge()$in( + )4$in( )log$paren($q(a,b))$in( )d$in( )$paren(e$in( . )f,$(,$))$in( )f$hinge()$in( + )2$in( )$paren(a$in( . )b,$(,$))$in( )d$in( )$paren(e$in( . )f,$(,$))$in( )f$hinge()$in( + )4$in( )log$paren(a$in( )b)$in( )c$in( )$paren(e$in( . )f,$(,$))$in( )f$hinge()$in( + )2$in( )$paren(b$in( . )a,$(,$))$in( )c$in( )$paren(e$in( . )f,$(,$))$in( )f$hinge()$in( + )4$in( )log$paren($q(a,b))$in( )c$in( )$paren(e$in( . )f,$(,$))$in( )f$hinge()$in( + )2$in( )$paren(a$in( . )b,$(,$))$in( )c$in( )$paren(e$in( . )f,$(,$))$in( )f$hinge()$in( + )4$in( )log$paren(a$in( )b)$in( )d$in( )e$hinge()$in( + )2$in( )$paren(b$in( . )a,$(,$))$in( )d$in( )e$hinge()$in( + )4$in( )log$paren($q(a,b))$in( )d$in( )e$hinge()$in( + )2$in( )$paren(a$in( . )b,$(,$))$in( )d$in( )e$hinge()$in( + )4$in( )log$paren(a$in( )b)$in( )c$in( )e$hinge()$in( + )2$in( )$paren(b$in( . )a,$(,$))$in( )c$in( )e$hinge()$in( + )4$in( )log$paren($q(a,b))$in( )c$in( )e$hinge()$in( + )2$in( )$paren(a$in( . )b,$(,$))$in( )c$in( )e
(c19) /* To illustrate the use of FACTORFACSUM, we recover the original form
of EXP6. */
factorfacsum(exp6_expanded,operator(".",log));
|$label(0,15,Times New Roman,$(d19$))2$hinge()$in( )$open($()$paren(e$in( . )f,$(,$))$in( )$paren(h$in( + )f,$(,$))$hinge()$in( + )e$close($))$hinge()$in( )$open($()x$hinge()$in( + )2$in( )log$paren(a$in( )b)$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )$paren(b$in( . )a,$(,$))$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )2$in( )log$paren($q(a,b))$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )$paren(a$in( . )b,$(,$))$in( )$paren(d$in( + )c,$(,$))$close($))
(c20) is(%=exp6);
|$label(0,15,Times New Roman,$(d20$))true
(c21) /* There is a switch NEXTLAYERFACTOR[FALSE] which can be used in two
ways to control the behavior of FACSUM. By setting
NEXTLAYERFACTOR:TRUE one can force FACSUM to FACTOR the coefficients of
the variables specified at any level before it calls itself recursively
on the factors of those coefficients.
*/
exp7: f*h + f*g - 2*c*d*f^2 + 2*c*d*e^2;
|$label(0,15,Times New Roman,$(d21$))f$in( )h$hinge()$in( + )f$in( )g$hinge()$in( - )2$in( )c$in( )d$in( )$sup(f,2)$hinge()$in( + )2$in( )c$in( )d$in( )$sup(e,2)
(c22) facsum(exp7,c,[e]), nextlayerfactor:true;
|$label(0,15,Times New Roman,$(d22$))f$in( )$paren(h$in( + )g,$(,$))$hinge()$in( - )2$in( )c$in( )d$in( )$paren(f$in( - )e,$(,$))$in( )$paren(f$in( + )e,$(,$))
(c23) facsum(exp7,c,[e]);
|$label(0,15,Times New Roman,$(d23$))f$in( )$paren(h$in( + )g,$(,$))$hinge()$in( + )c$in( )$paren(2$in( )d$in( )$sup(e,2)$in( - )2$in( )d$in( )$sup(f,2),$(,$))
(c24) /* The second method for controlling the behavior of FACSUM is to include
the atom NEXTLAYERFACTOR in the in the argument list of FACSUM.
*/
facsum(exp7,c,'nextlayerfactor,[e]);
|$label(0,15,Times New Roman,$(d24$))f$in( )$paren(h$in( + )g,$(,$))$hinge()$in( - )2$in( )c$in( )d$in( )$paren(f$in( - )e,$(,$))$in( )$paren(f$in( + )e,$(,$))
(c25) /* Notice that this method produced the same result as simply setting
NEXTLAYERFACTOR:TRUE. The difference between the two methods is that the
second method allows one to achieve the effect of NEXTLAYERFACTOR:TRUE
for only a few specified levels of the expression, instead of for all
levels. For example, consider EXP8.
*/
exp8: - 2*c*d*f^2*h^2*l^2 + f*h^2*l^2 - 4*c*d*f^2*h^2*k*l + 2*f*h^2*k*l
- 4*c*d*f^2*g*h*l + 2*f*g*h*l - 2*c*d*f^2*h^2*k^2 + f*h^2*k^2
- 4*c*d*f^2*g*h*k + 2*f*g*h*k - 2*c*d*f^2*g^2 + f*g^2 + 2*c*d*e^2;
|$label(0,15,Times New Roman,$(d25$))$in( - )2$in( )c$in( )d$in( )$sup(f,2)$in( )$sup(h,2)$in( )$sup(l,2)$hinge()$in( + )f$in( )$sup(h,2)$in( )$sup(l,2)$hinge()$in( - )4$in( )c$in( )d$in( )$sup(f,2)$in( )$sup(h,2)$in( )k$in( )l$hinge()$in( + )2$in( )f$in( )$sup(h,2)$in( )k$in( )l$hinge()$in( - )4$in( )c$in( )d$in( )$sup(f,2)$in( )g$in( )h$in( )l$hinge()$in( + )2$in( )f$in( )g$in( )h$in( )l$hinge()$in( - )2$in( )c$in( )d$in( )$sup(f,2)$in( )$sup(h,2)$in( )$sup(k,2)$hinge()$in( + )f$in( )$sup(h,2)$in( )$sup(k,2)$hinge()$in( - )4$in( )c$in( )d$in( )$sup(f,2)$in( )g$in( )h$in( )k$hinge()$in( + )2$in( )f$in( )g$in( )h$in( )k$hinge()$in( - )2$in( )c$in( )d$in( )$sup(f,2)$in( )$sup(g,2)$hinge()$in( + )f$in( )$sup(g,2)$hinge()$in( + )2$in( )c$in( )d$in( )$sup(e,2)
(c26) facsum(exp8,c,'nextlayerfactor,[f]);
|$label(0,15,Times New Roman,$(d26$))f$in( )$sup($paren(h$in( )l$in( + )h$in( )k$in( + )g,$(,$)),2)$hinge()$in( - )2$in( )c$in( )d$in( )$paren(f$in( )$paren(h$in( )l$in( + )h$in( )k$in( + )g,$(,$))$in( - )e,$(,$))$in( )$paren(f$in( )$paren(h$in( )l$in( + )h$in( )k$in( + )g,$(,$))$in( + )e,$(,$))
(c27) facsum(exp8,c,[f,'nextlayerfactor]);
|$label(0,15,Times New Roman,$(d27$))c$in( )$paren(2$in( )d$in( )$sup(e,2)$in( - )2$in( )d$in( )$sup(f,2)$in( )$sup($paren(h$in( )l$in( + )h$in( )k$in( + )g,$(,$)),2),$(,$))$hinge()$in( + )f$in( )$sup($paren(h$in( )l$in( + )h$in( )k$in( + )g,$(,$)),2)
(c28) /* Another switch facsum_combine[true] controls the form returned by
facsum when its argument has a denominator. If FACSUM_COMBINE is TRUE
then the form returned will be a ratio of polynomials. If FALSE, then
the denominator factors will be distributed over the terms of the
numerator. In either case, both the numerator and denominator will
be processed according to the arguments of FACSUM.
*/
exp1/(c*(e+f)+d*e);
|$label(0,15,Times New Roman,$(d28$))$q(d$in( )e$in( )$sup(f,2)$in( + )c$in( )e$in( )$sup(f,2)$in( - )d$in( )e$in( + )c$in( )e$in( + )b$in( )c$in( )d$in( + )a$in( )c$in( )d,c$in( )$paren(f$in( + )e,$(,$))$in( + )d$in( )e)
(c29) facsum(exp1/(c*(e+f)+d*e),e,f,[c,d]);
|$label(0,15,Times New Roman,$(d29$))$q($paren(d$in( + )c,$(,$))$in( )e$in( )$sup(f,2)$in( + )$paren(c$in( - )d,$(,$))$in( )e$in( + )$paren(b$in( + )a,$(,$))$in( )c$in( )d,c$in( )f$in( + )$paren(d$in( + )c,$(,$))$in( )e)
(c30) facsum(exp1/(c*(e+f)+d*e),e,f,[c,d]), facsum_combine:false;
|$label(0,15,Times New Roman,$(d30$))$q($paren(d$in( + )c,$(,$))$in( )e$in( )$sup(f,2),c$in( )f$in( + )$paren(d$in( + )c,$(,$))$in( )e)$hinge()$in( + )$q($paren(c$in( - )d,$(,$))$in( )e,c$in( )f$in( + )$paren(d$in( + )c,$(,$))$in( )e)$hinge()$in( + )$q($paren(b$in( + )a,$(,$))$in( )c$in( )d,c$in( )f$in( + )$paren(d$in( + )c,$(,$))$in( )e)
(c31) /* It is also possible to control the form of the coefficients of
products of quantities specified in the argument list of FACSUM.
(Normally, these coefficients are factored, unless they are numbers, and
the function that is used for this purpose is called NONUMFACTOR.) But
it is possible to use other functions in place of NONUMFACTOR by changing
the AUTOMATIC property of FACSUM.
*/
get('facsum,'automatic);
|$label(0,15,Times New Roman,$(d31$))nonumfactor
(c32) /* Let us illustrate this procedure by changing from NONUMFACTOR
to SQFR. */
put('facsum,'sqfr,'automatic);
|$label(0,15,Times New Roman,$(d32$))sqfr
(c33) /* Now compare the behavior of FACSUM to its former
behavior. Here is what it did with NONUMFACTOR AUTOMATIC: */
answer;
|$label(0,15,Times New Roman,$(d33$))c$in( )d$in( )$paren(u$in( )$sup(v,2)$in( )$paren(z$in( + )y,$(,$))$in( - )u$in( )$paren(z$in( - )y,$(,$))$in( + )x$in( )y$in( )z$in( + )w$in( )y$in( )z$in( + )b,$(,$))$hinge()$in( + )c$in( )e$in( )$paren($sup(f,2)$in( + )1,$(,$))$hinge()$in( + )d$in( )e$in( )$paren(f$in( - )1,$(,$))$in( )$paren(f$in( + )1,$(,$))
(c34) /* And now with SQFR AUTOMATIC: */
facsum(exp2,c,d,[u,v]);
|$label(0,15,Times New Roman,$(d34$))c$in( )d$in( )$paren(u$in( )$sup(v,2)$in( )$paren(z$in( + )y,$(,$))$in( - )u$in( )$paren(z$in( - )y,$(,$))$in( + )$paren(x$in( + )w,$(,$))$in( )y$in( )z$in( + )b,$(,$))$hinge()$in( + )c$in( )e$in( )$paren($sup(f,2)$in( + )1,$(,$))$hinge()$in( + )d$in( )e$in( )$paren($sup(f,2)$in( - )1,$(,$))
(c35) /* Since this particular choice for AUTOMATIC is so useful, it is
available as a separate function, SQFRFACSUM. More complicated choices
are possible, depending on the requirements of the situation. One
possibility is illustrated below.
The AUTOMATIC function can be declared FORMAL. If this is done, then the
function will not be applied, but will be introduced into the expression
in the places where it would have been applied. This capability is useful
for constructing expressions that one intends to use later in function
definitions. We illustrate with SQFR.
*/
declare(sqfr,formal)$
(c36) facsum(exp2,c,d,[u,v]);
|$label(0,15,Times New Roman,$(d36$))c$in( )d$in( )$paren(sqfr$paren($paren(x$in( + )w,$(,$))$in( )y$in( )z$in( + )b)$in( + )u$in( )$sup(v,2)$in( )sqfr$paren(z$in( + )y)$in( + )u$in( )sqfr$paren(y$in( - )z),$(,$))$hinge()$in( + )c$in( )sqfr$paren(e$in( )$sup(f,2)$in( + )e)$hinge()$in( + )d$in( )sqfr$paren(e$in( )$sup(f,2)$in( - )e)
(c37) /* Now restore the default AUTOMATIC property. */
put('facsum,'nonumfactor,'automatic);
|$label(0,15,Times New Roman,$(d37$))nonumfactor
(c38) /* Sometimes one must combine large expressions that have already been
processed with FACSUM, perhaps in different Macsymas for reasons of
space. To combine these expressions it is not necessary to FACSUM their
sum. An alternative is to use COLLECTTERMS. We illustrate the use of
COLLECTTERMS on expressions EXP9 and EXP10. */
exp9:a*u+b;
|$label(0,15,Times New Roman,$(d38$))a$in( )u$hinge()$in( + )b
(c39) exp10:c*u+d;
|$label(0,15,Times New Roman,$(d39$))c$in( )u$hinge()$in( + )d
(c40) /* COLLECTERMS(exp, var1, var2..) collects terms of exp that contain
like powers of the vari. */
collectterms(exp9+exp10,u);
C:\MACSD2B\share\facex1.fas being loaded.
|$label(0,15,Times New Roman,$(d40$))$paren(c$in( + )a,$(,$))$in( )u$hinge()$in( + )d$hinge()$in( + )b
(c41) e*u^2+f/u+b+d;
|$label(0,15,Times New Roman,$(d41$))e$in( )$sup(u,2)$hinge()$in( + )$q(f,u)$hinge()$in( + )d$hinge()$in( + )b
(c42) exp11:expand(%+exp10*u);
|$label(0,15,Times New Roman,$(d42$))e$in( )$sup(u,2)$hinge()$in( + )c$in( )$sup(u,2)$hinge()$in( + )d$in( )u$hinge()$in( + )$q(f,u)$hinge()$in( + )d$hinge()$in( + )b
(c43) collectterms(%,u);
|$label(0,15,Times New Roman,$(d43$))$paren(e$in( + )c,$(,$))$in( )$sup(u,2)$hinge()$in( + )d$in( )u$hinge()$in( + )$q(f,u)$hinge()$in( + )d$hinge()$in( + )b
(c44) /* A more complex example: */
u^2*v+exp11+subst(v,u,exp11);
|$label(0,15,Times New Roman,$(d44$))e$in( )$sup(v,2)$hinge()$in( + )c$in( )$sup(v,2)$hinge()$in( + )$sup(u,2)$in( )v$hinge()$in( + )d$in( )v$hinge()$in( + )$q(f,v)$hinge()$in( + )e$in( )$sup(u,2)$hinge()$in( + )c$in( )$sup(u,2)$hinge()$in( + )d$in( )u$hinge()$in( + )$q(f,u)$hinge()$in( + )2$in( )d$hinge()$in( + )2$in( )b
(c45) collectterms(%,u,v);
|$label(0,15,Times New Roman,$(d45$))$paren(e$in( + )c,$(,$))$in( )$sup(v,2)$hinge()$in( + )$sup(u,2)$in( )v$hinge()$in( + )d$in( )v$hinge()$in( + )$q(f,v)$hinge()$in( + )$paren(e$in( + )c,$(,$))$in( )$sup(u,2)$hinge()$in( + )d$in( )u$hinge()$in( + )$q(f,u)$hinge()$in( + )2$in( )d$hinge()$in( + )2$in( )b
(c46) /* COLLECTTERMS also accepts arguments in the same form as FACSUM. */
exp2;
|$label(0,15,Times New Roman,$(d46$))c$in( )d$in( )$paren(x$in( )y$in( )z$in( + )w$in( )y$in( )z$in( + )u$in( )$sup(v,2)$in( )z$in( - )u$in( )z$in( + )u$in( )$sup(v,2)$in( )y$in( + )u$in( )y,$(,$))$hinge()$in( + )d$in( )e$in( )$sup(f,2)$hinge()$in( + )c$in( )e$in( )$sup(f,2)$hinge()$in( - )d$in( )e$hinge()$in( + )c$in( )e$hinge()$in( + )b$in( )c$in( )d
(c47) collectterms(exp2,c,d,[u,v]);
|$label(0,15,Times New Roman,$(d47$))c$in( )d$in( )$paren(u$in( )$sup(v,2)$in( )$paren(z$in( + )y,$(,$))$in( + )x$in( )y$in( )z$in( + )w$in( )y$in( )z$in( + )u$in( )$paren(y$in( - )z,$(,$))$in( + )b,$(,$))$hinge()$in( + )c$in( )$paren(e$in( )$sup(f,2)$in( + )e,$(,$))$hinge()$in( + )d$in( )$paren(e$in( )$sup(f,2)$in( - )e,$(,$))
(c48) exp5_factored;
|$label(0,15,Times New Roman,$(d48$))x$hinge()$in( + )2$in( )log$paren(a$in( )b)$in( )d$hinge()$in( + )$paren(b$in( . )a,$(,$))$in( )d$hinge()$in( + )2$in( )log$paren($q(a,b))$in( )d$hinge()$in( + )$paren(a$in( . )b,$(,$))$in( )d$hinge()$in( + )2$in( )log$paren(a$in( )b)$in( )c$hinge()$in( + )$paren(b$in( . )a,$(,$))$in( )c$hinge()$in( + )2$in( )log$paren($q(a,b))$in( )c$hinge()$in( + )$paren(a$in( . )b,$(,$))$in( )c
(c49) collectterms(exp5_factored,operator(log,"."));
|$label(0,15,Times New Roman,$(d49$))x$hinge()$in( + )log$paren(a$in( )b)$in( )$paren(2$in( )d$in( + )2$in( )c,$(,$))$hinge()$in( + )log$paren($q(a,b))$in( )$paren(2$in( )d$in( + )2$in( )c,$(,$))$hinge()$in( + )$paren(b$in( . )a,$(,$))$in( )$paren(d$in( + )c,$(,$))$hinge()$in( + )$paren(a$in( . )b,$(,$))$in( )$paren(d$in( + )c,$(,$))
(c50) /* Clean up */
(remvalue(answer,exp5_factored,exp6_expanded),remove(sqfr,formal))$
(c51) /* To complete clean up, execute this form
remvalue(exp1,exp2,exp3,exp4,exp5,exp6,exp7,exp8,exp9,exp10,exp11)$ */